// 定义表结构和表操作方法
var Mongoose = require('mongoose');
var bcrypt = require('bcryptjs');
var SALT_WORK_FACTOR = 10;
var UserSchema = new Mongoose.Schema({
  name: {
    unique: true,
    type: String
  },
  password: {
    unique: true,
    type:String
  },
  // 权限控制
  // undefined 访客 - view movie page 
  // 0 init user - view movie page - commit comment
  // 2 verified user - view movie page - commit comment
  // 10+ admin - movie admin
  // 50+ super admin - user admin
  role: {
    type: Number,
    default: 0
  },
  meta: {
    createAt: {
      type: Date,
      default: Date.now()
    },
    updateAt: {
      type: Date,
      default: Date.now()
    }
  }
});

// 存储数据之前调用的方法
UserSchema.pre('save', function (next) {
  var user = this;
  // 存储新数据同时更新元数据的建立时间和更新时间
  if (this.isNew) {
    this.meta.createAt = this.meta.updateAt = Date.now();
  // 存储已有数据只需更新元数据的更新时间即可
  } else {
    this.meta.updateAt = Date.now();
  }

  bcrypt.genSalt(SALT_WORK_FACTOR, function(err, salt) {
    if (err) return next(err);
    bcrypt.hash(user.password, salt, function(err, hash) {
      if (err) return next(err);
      user.password = hash;
      next();
    });
  });
});

// 实例方法

UserSchema.methods = {
  comparePassword: function(_password, cb) {
    bcrypt.compare(_password, this.password, function(err, isMatch) {
      if (err) return cb(err);

      cb(null, isMatch);
    });
  }
};

// 静态方法
UserSchema.statics = {
  fetch: function(cb) {
    return this
      .find({})
      .sort('meta.updateAt')
      .exec(cb);
  },
  findById: function (id, cb) {
    return this
      .findOne({_id: id})
      .exec(cb);
  }
};

module.exports = UserSchema;
